昨天介紹在 Go 語言中函式 (function) 的傳回值,那我們今天繼續學習參數不定的函式~~
參數不定函式(variadic function) 是指函式可以接收數量不確定的參數,所以當無法確定參數要接收多少數量時,便可以使用:
func f(參數名稱 ...型別)
上面的 ...
稱為 打包算符(pack operator) ,打包算符可以讓所有符合型別的引數,都放進此參數名稱,並打包成一個切片,如此一來便成為一個可以接收任意數量,或是可以完全沒有引數的切片。
範例 1:
package main
import "fmt"
func myFavorite(name ...string) {
fmt.Println(name)
}
func main(){
myFavorite("奇犽", "西索")
myFavorite("佐藤壽也")
myFavorite()
}
範例 1(執行結果):
[奇犽 西索]
[佐藤壽也]
[]
根據範例 1 裡的 myFavorite() 就是一個參數不定函式。而參數不定函式也可以有其他的參數,但要特別注意一個函式只能有一組數量不定的參數,且此數量不定的參數必須放在最後一個參數。
範例 2:
package main
import "fmt"
func myFavorite(name ...string, age int) {
fmt.Println(name, age)
}
func main(){
myFavorite("奇犽", "小傑", 12)
}
範例 2(執行結果):
./main.go:1120:22: can only use ... with final parameter in list
./main.go:1125:36: too many arguments in call to myFavorite
have (string, string, number)
want (string, int)
若是沒有將數量不定的參數擺在最後面,會出現錯誤訊息 can only use ... with final parameter in list
,要修正錯誤只需要交換參數位置,如下:
範例 3:
package main
import "fmt"
func myFavorite(age int, name ...string) {
fmt.Println(name, age)
}
func main(){
myFavorite(12, "奇犽", "小傑")
}
範例 3(執行結果):
[奇犽 小傑] 12
前面有說到若是參數不定的函式,Go 語言會將其轉成切片,我們根據範例 4 來確認 ...string
是否變成切片 []string
,以及若為切片那他的長度跟容量又各是多少呢?
範例 4:
package main
import "fmt"
func myFavorite(name ...string) {
fmt.Println(name)
fmt.Println("len:", len(name), ", cap:", cap(name))
fmt.Printf("%T\n", name) // 使用 Printf 加上 %T 印出型別
}
func main(){
myFavorite("奇犽", "小傑")
}
範例 4(執行結果):
[奇犽 小傑]
len: 2 , cap: 2
[]string // 是字串型別的切片
我們若想要將切片當作引數,傳給參數不定的函式,需要使用解包算符將切片解開,就可以一一當引數傳給參數不定的函式。
範例 5:
package main
import "fmt"
func myFavorite(name ...string) {
fmt.Println(name)
}
func main(){
name := []string{"奇犽", "小傑"} // 定義一個 name 的字串切片
myFavorite(name...) // 將 name 用 ... (解包算符)拆解
}
範例 5(執行結果):
[奇犽 小傑]
補充:
只有切片可以使用解包算符,若想將陣列拆解,可以使用 陣列[:]... 語法將其轉成切片,傳入參數不定的函式。
今天就先介紹到參數不定函式,明天再來繼續學習匿名函式,明天見~~